import TUIChatEngine, { TUITranslateService, TUIStore, StoreName, IMessageModel } from '@tencentcloud/chat-uikit-engine';
// import { Toast, TOAST_TYPE } from '../../common/Toast/index';

export function deepCopy(data : any, hash = new WeakMap()) {
	if (typeof data !== 'object' || data === null || data === undefined) {
		return data;
	}
	if (hash.has(data)) {
		return hash.get(data);
	}
	const newData : any = Object.create(Object.getPrototypeOf(data));
	const dataKeys = Object.keys(data);
	dataKeys.forEach((value) => {
		const currentDataValue = data[value];
		if (typeof currentDataValue !== 'object' || currentDataValue === null) {
			newData[value] = currentDataValue;
		} else if (Array.isArray(currentDataValue)) {
			newData[value] = [...currentDataValue];
		} else if (currentDataValue instanceof Set) {
			newData[value] = new Set([...currentDataValue]);
		} else if (currentDataValue instanceof Map) {
			newData[value] = new Map([...currentDataValue]);
		} else {
			hash.set(data, data);
			newData[value] = deepCopy(currentDataValue, hash);
		}
	});
	return newData;
}

export const handleSkeletonSize = (
	width : number,
	height : number,
	maxWidth : number,
	maxHeight : number,
) : { width : number; height : number } => {
	const widthToHeight = width / height;
	const maxWidthToHeight = maxWidth / maxHeight;
	if (width <= maxWidth && height <= maxHeight) {
		return { width, height };
	}
	if (
		(width <= maxWidth && height > maxHeight)
		|| (width > maxWidth && height > maxHeight && widthToHeight <= maxWidthToHeight)
	) {
		return { width: width * (maxHeight / height), height: maxHeight };
	}
	return { width: maxWidth, height: height * (maxWidth / width) };
};

// Image loading complete
export function getImgLoad(container : any, className : string, callback : any) {
	const images = container?.querySelectorAll(`.${className}`) || [];
	const promiseList = Array.prototype.slice.call(images).map((node : any) => {
		return new Promise((resolve : any) => {
			node.onload = () => {
				resolve(node);
			};
			node.onloadeddata = () => {
				resolve(node);
			};
			node.onprogress = () => {
				resolve(node);
			};
			if (node.complete) {
				resolve(node);
			}
		});
	});
	return Promise.all(promiseList)
		.then(() => {
			callback && callback();
		})
		.catch((e) => {
			console.error('网络异常', e);
		});
}

export const isCreateGroupCustomMessage = (message : IMessageModel) => {
	return (
		message.type === TUIChatEngine.TYPES.MSG_CUSTOM
		&& message?.getMessageContent()?.businessID === 'group_create'
	);
};

/**
 * displayMessageReadReceipt 用户级别控制展示消息阅读状态
 * 关闭后 你收发的消息均不带消息阅读状态
 * 你将无法看到对方是否已读 同时对方也无法看到他发送的消息你是否已读
 *
 * enabledMessageReadReceipt app级别是否开启已读回执
 *
 * @return {boolean} - Returns a boolean value indicating if the message read receipt is enabled globally.
 */
export function isEnabledMessageReadReceiptGlobal() : boolean {
	return TUIStore.getData(StoreName.USER, 'displayMessageReadReceipt')
		&& TUIStore.getData(StoreName.APP, 'enabledMessageReadReceipt');
}

export function shallowCopyMessage(message : IMessageModel) {
	return Object.assign({}, message);
}

export async function copyText(text : string) {
	const textString = text.toString();
	try {
		// 优先采用异步 copy navigator.clipboard 方案
		await navigator.clipboard.writeText(textString);
	} catch (err : any) {
		// 不支持 navigator.clipboard 时，走兼容替代方案
		copyTextByDocumentExecCommand(textString);
	}
}

function copyTextByDocumentExecCommand(textString : string) {
	const input = document.createElement('input');
	input.id = 'copy-input';
	input.readOnly = true; // Prevent IOS focus from triggering keyboard events
	input.style.position = 'absolute';
	input.style.left = '-1000px';
	input.style.zIndex = '-1000';
	document.body.appendChild(input);
	input.value = textString;
	selectText(input, 0, textString.length);
	if (document.execCommand('copy')) {
		document.execCommand('copy');
	} else {
		// Toast({
		// 	message: TUITranslateService.t('TUIChat.此机型暂不支持复制'),
		// 	type: TOAST_TYPE.ERROR,
		// });
	}
	input.blur();
}

function selectText(
	textbox : HTMLInputElement,
	startIndex : number,
	stopIndex : number,
) {
	if ((textbox as any).createTextRange) {
		// ie
		const range = (textbox as any).createTextRange();
		range.collapse(true);
		range.moveStart('character', startIndex); // start character
		range.moveEnd('character', stopIndex - startIndex); // end character
		range.select();
	} else {
		// firefox / chrome
		(textbox as any).setSelectionRange(startIndex, stopIndex);
		(textbox as any).focus();
	}
}